package com.zenithmind.task.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * 任务状态枚举
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Getter
@AllArgsConstructor
public enum TaskStatus {

    /**
     * 待办
     */
    TODO(1, "待办", "todo"),

    /**
     * 进行中
     */
    IN_PROGRESS(2, "进行中", "in_progress"),

    /**
     * 已完成
     */
    COMPLETED(3, "已完成", "completed"),

    /**
     * 已取消
     */
    CANCELLED(4, "已取消", "cancelled"),

    /**
     * 已暂停
     */
    PAUSED(5, "已暂停", "paused");

    /**
     * 状态码
     */
    private final Integer code;

    /**
     * 状态名称
     */
    private final String name;

    /**
     * 状态标识
     */
    private final String key;

    /**
     * 根据状态码获取枚举
     * 
     * @param code 状态码
     * @return 任务状态枚举
     */
    public static TaskStatus getByCode(Integer code) {
        if (code == null) {
            return null;
        }
        for (TaskStatus status : values()) {
            if (status.getCode().equals(code)) {
                return status;
            }
        }
        return null;
    }

    /**
     * 根据状态标识获取枚举
     * 
     * @param key 状态标识
     * @return 任务状态枚举
     */
    public static TaskStatus getByKey(String key) {
        if (key == null) {
            return null;
        }
        for (TaskStatus status : values()) {
            if (status.getKey().equals(key)) {
                return status;
            }
        }
        return null;
    }

    /**
     * 检查是否为完成状态
     * 
     * @return 是否完成
     */
    public boolean isCompleted() {
        return this == COMPLETED;
    }

    /**
     * 检查是否为进行中状态
     * 
     * @return 是否进行中
     */
    public boolean isInProgress() {
        return this == IN_PROGRESS;
    }

    /**
     * 检查是否为活跃状态（待办或进行中）
     * 
     * @return 是否活跃
     */
    public boolean isActive() {
        return this == TODO || this == IN_PROGRESS;
    }

    /**
     * 检查是否为终止状态（已完成、已取消）
     * 
     * @return 是否终止
     */
    public boolean isTerminated() {
        return this == COMPLETED || this == CANCELLED;
    }
}
